package com.ssy.lingxi.common.utils;

import java.security.NoSuchAlgorithmException;

/**
 * 用户密码加解密工具类
 * @author 万宁
 * @version 2.0.0
 * @date 2020-06-05
 */
public class PasswordUtil {
    private static PasswordUtil instance = new PasswordUtil();

    private final String MD5_SALT = "lingxi";

    private PasswordUtil() {
    }

    public static PasswordUtil instance() {
        return instance;
    }

    /**
     * 先解密Aes加密的密码，再用Md5签名
     * @param aesEncryptedPassword Aes加密后的密码
     * @return MD5 签名后的密码
     */
    public String decryptAesThenMd5(String aesEncryptedPassword) throws Exception {
        return passwordToMd5String(Aes128Util.aesDecrypt(aesEncryptedPassword));
    }

    /**
     * MD5(Salt字符串 + 原始密码字符串) = 加密后的密码
     * @param plainPassword 明文密码
     * @return 加密后的密码
     */
    public String passwordToMd5String(String plainPassword) throws NoSuchAlgorithmException {
        return MD5Util.Instance().MD32bitToHexString(this.MD5_SALT.concat(plainPassword));
    }

    /**
     * MD5(Salt字符串 + 原始密码字符串) = 加密后的密码
     * @param plainPassword 明文密码
     * @return 加密后的密码
     */
    public String tryMd5PlainString(String plainPassword) {
        try {
            return MD5Util.Instance().MD32bitToHexString(this.MD5_SALT.concat(plainPassword));
        } catch (Exception ignored) {
            return "";
        }
    }

    /**
     * 校验用户密码（登录密码、支付密码）
     * @param md5SignedPassword 保存在数据库里经过MD5签名后的密码
     * @param aesEncryptedPassword   客户端传入的经过Aes加密后的密码
     * @return 是否匹配
     */
    public boolean checkPassword(String md5SignedPassword, String aesEncryptedPassword) {
        try {
            String password = passwordToMd5String(Aes128Util.aesDecrypt(aesEncryptedPassword));
            return md5SignedPassword.equals(password);
        } catch (Exception e) {
            return false;
        }
    }

}
